
/* 
react是合作式调度，也就是商量着来
React告诉浏览器说每一帧请给我5ms时间让我做自己的工作
我承诺5ms后不管我的工作干完没干完，我都 会控制权交还给浏览器，执行浏览器绘制，响应用户输入等高优的操作 
*/

import {
  scheduleCallback,
  shouldYield,
  ImmediatePriority,
  UserBlockingPriority,
  NormalPriority,
  LowPriority,
  IdlePriority,
  cancelCallback
} from './scheduler'

let result = 0;
let i = 0;

/**
 * 要想能够方便的让任务能够 暂停和恢复 ，需要数据结构支持
 * @returns 
 */
function calculate(didTimeout) {
  //shouldYield 浏览器分配的时间片5ms已经到期了，就会放弃本任务的执行
  //把线程的资源交还给浏览器，让浏览器执行更高优先级的工作，比如页面绘制，响应用户输入
  for (; i < 1000 && (!shouldYield()||didTimeout); i++) {
    result += 1;
  }
  //当退出本任务的时候，如果任务没有完成，返回任务函数本身，如果任务完成了就返回null
  if (i < 1000) {
    return calculate;
  } else {
      console.log('result', result);
      return false;
  }
}

let result2 = 0;
let i2 = 0;
function calculate2(didTimeout) {
    if (i2 === 0) { console.log('开始calculate2') }
    for (; i2 < 2000 && (!shouldYield()||didTimeout ); i2++) {
        result2 += 1;
    }
    if (i2 < 2000) {
        return calculate2;
    } else {
        console.log('result2', result2);
        return false;
    }
}

let result3 = 0;
let i3 = 0;
function calculate3(didTimeout) {
    if (i3 === 0) { console.log('开始calculate3') }
    for (; i3 < 3000 && (!shouldYield()||didTimeout ); i3++) {
        result3 += 1;
    }
    if (i3 < 3000) {
        return calculate3;
    } else {
        console.log('result3', result3);
        return false;
    }
}
scheduleCallback(ImmediatePriority,calculate);
//有些时候我不想让这个任务立刻开始，而是希望它延迟一段开始
 scheduleCallback(LowPriority,calculate2,{ delay: 6000 });

const task =  scheduleCallback(UserBlockingPriority,calculate3);
cancelCallback(task)


